package com.sjc.algorithm.job;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author by SangJiacun
 * @Date 2020/5/14 16:03
 */
public class LinkedLru<K,V> extends LinkedHashMap<K,V> implements Map<K,V> {

    /**
     * 当accessOrder为true时，get方法和put方法都会调用recordAccess方法使得最近使用的Entry移到双向链表的末尾；
     * 当accessOrder为默认值false时，从源码中可以看出recordAccess方法什么也不会做
     * @param initialCapacity
     * @param loadFactor
     * @param accessOrder
     */
    public LinkedLru(int initialCapacity, float loadFactor, boolean accessOrder) {
        super(initialCapacity, loadFactor,accessOrder);
    }

    /**
     * 重写LinkedHashMap中的removeEldestEntry方法，当LRU中元素多余5个时，删除最不经常使用的元素
     * @param eldest
     * @return
     */
    @Override
    protected boolean removeEldestEntry(Entry<K, V> eldest) {
        if(size() > 5){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        LinkedLru<String, String> lru = new LinkedLru<>(5, 0.75f, true);
        lru.put("01","用户1信息");
        lru.put("02","用户2信息");
        lru.put("03","用户3信息");
        lru.put("04","用户4信息");
        lru.put("05","用户5信息");
        lru.get("02");

        lru.put("04","用户4信息更新");
        lru.put("06","用户6信息");

        System.out.println(lru.get("01")); //null
        System.out.println(lru.get("06"));
    }
}
